Fortran编程:(三)数据类型

您所在的位置:网站首页 boolean_T 是什么数据类型 Fortran编程:(三)数据类型

Fortran编程:(三)数据类型

2023-09-07 03:33| 来源: 网络整理| 查看: 265

一、数据类型

在C++中,其数据类型有布尔型(bool)、字符型(char)、整型(int)、浮点型(float)、双浮点型(double)等,并且一些基本类型可以使用一个或多个类型修饰符(signed、unsigned、short、long)进行修饰,使得C++具有丰富的数据类型。

相比于C++,Fortran中的数据类型有整型(integer)、实型(real)、复数型(complex)、逻辑型(logical)、字符型(character)等,没有类似于C++中的修饰符。

由于C++中可通过修饰符控制变量的精度范围,类似地,在Fortran中,可通过Kind值来控制精度范围。

二、Kind值

Kind 的正式名称叫“种别”,是区分同一种数据类型,但不同长度、或精度、或编码方式的一种代号。他在编译时决定!Kind 受编译器的影响,具体数值可能会有差异。Kind 对不同的变量类型,表达的意思也不相同。

对 Integer ,Kind 值影响整数能表达的最大范围;对 Real 和 Complex, Kind 值影响实数的最大范围和最小精度;对 Character ,Kind 值表示编码。通常为 ASCII 编码;对 Logical , Kind 值表示长度,对逻辑型无影响。

(1)Integer的Kind值

对于Integer来说,其Kind值一般为1、2、4、8,对于大多数编译器,Kind 默认是 4,占有 4 个字节。

不同的Kind值,其取值范围不一样。

Kind值1248类型超短整型短整型整型超长整型取值范围-2^7~2^7-1

-2^15~2^15-1

-2^31~2^31-1-2^63~2^63-1

由于某些编译器不支持Kind=8, Kind=1 ,而某些编译器用1、2、3、4 表示,为了代码的适用性和统一性,可以使用函数Selected_Int_Kind,即k = Selected_Int_Kind( i )  来选择能满足要求的Kind,其中i 表示需要最大的十进制位数,k 表示返回的能满足范围的最小的Kind值。

(2)Real的Kind值

对于Real来说,其Kind值一般为4、8、16,对于大多数编译器,Kind 默认是 4,占有 4 个字节。

不同的Kind值,其取值范围不一样。

由于某些编译器不支持Kind=16,而某些编译器用1、2、3表示,为了代码的适用性和统一性,可以使用函数Selected_Real_Kind,即k = Selected_Real_Kind(r,p)  来选择能满足要求的Kind,其中r 表示需要最大的十进制位数 , p 表示最小的有效位数,k 表示返回的能满足范围的最小的Kind值。

(3)Complex的Kind值

Complex 的数据类型与 Real 一致。

但需要注意的是:如果 Kind=8 的 Real 占用 8 字节,则 Kind=8 的 Complex 占有 16 字节,很多人使用 Complex(Kind=16) 来定义双精度,实际上,这已经是四精度了。

Complex 选择Kind,也使用 Selected_Real_Kind 函数

(4)Character的Kind值

Character 的 Kind,常见只有一种,即 1 表示 ASCII 编码,通常忽略。

也可以使用 Selected_Char_Kind 来选择,即k = Selected_Char_Kind( 'ASCII' )。

(5)Logical的Kind值

Logical 的 Kind,通常与该编译器支持的 Integer 一致,通常忽略,在大多数编译器上,Kind=4,占有4字节。

任何 Kind 值的 Logical 都只能表示真、假两个状态。

Logical 没有可以选择Kind值的函数。通常只有在混编时,才会需要更改 Kind 值。

三、各种数据类型的简单使用

如下代码简单的进行数据类型的测试:

program test implicit none integer,parameter::ip = Selected_Int_Kind(8) integer,parameter::dp = Selected_Real_Kind(15,6) character(len=20)::cform integer(kind=ip)::i=0,j real(kind=dp)::r1=1.,r2=2. complex(kind=dp)::cmplx1 logical::l1=.true. cmplx1=cmplx(r1,r2) !定义复数 write(*,*) '------------------------------------//Test Character' do j=1,3,1 write(cform,*) j write(*,*) 'My file is ','File_Number_'//trim(adjustl(cform))//'.txt'!可用//进行字符串连接 end do write(*,*) '------------------------------------//Test Integer' write(*,*) 'The kind value of i is',kind(i) write(*,*) 'The max value of i is',huge(i) write(*,*) '------------------------------------//Test Real' write(*,*) 'The kind value of r1 is',kind(r1) write(*,*) 'The max value of r1 is',huge(r1) write(*,*) '------------------------------------//Test Complex' write(*,*) 'The complex number is',cmplx1 write(*,*) 'The real part of complex number is',real(cmplx1) write(*,*) 'The imag part of complex number is',imag(cmplx1) write(*,*) '------------------------------------//Test Logical' if(l1) write(*,*) 'I am true ! ^&^' end program test

运行结果为:

此外,对于实型/浮点数而言,一般不做相等判断,因为浮点数存在有效位数,进行相等判断时,有时往往会超出预期,造成严重数值计算错误的后果。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3